﻿/*{
author=pk2.2（风铃等）
version=2.0
date=2023/03/19
}*/

/***
避免AI兵力过高而资源太少,考虑解甲归田来解决死局
***/

// ## 2023/05/03 # 铃 # 修复bug,美化显示。 ##
// ## 2023/05/02 # 铃 # 适配新的内政系统。 ##
// ## 2023/05/01 # 铃 # 完善了新的参数。 ##
// ## 2022/12/03 # 铃 # 新做了AI的解甲归田功能。 ##

namespace AI解甲归田
{

	// ================ CUSTOMIZE ================

	const int AI解甲归田_发动时期 = 0;
	const int AI解甲归田_发动概率_城市 = 0;

	// 全局常量 --------------------------------------------------

	// ===========================================

	class Main
	{

		Main()
		{
			pk::bind(202, pk::trigger202_t(onAIRunningOrder));
		}

		void onAIRunningOrder(pk::ai_context @context, pk::building @building, int cmd)
		{
			if (cmd == 据点AI_解甲归田)
			{
				int force_id;
				int pop_gain_final;
				pk::force@ force = context.force;
				int buildingid = building.get_id();
				auto base_t = ch::get_base_p(buildingid);
				int city_id = pk::get_city_id(building.pos);
				pk::city @city = pk::get_city(city_id);
				int rate = city.rate / 10;
				bool 大城市 = buildingid < 城市_末;

				int 季度粮收入 = 0;
				if (buildingid < 城市_末)
					季度粮收入 = CITY_HARVEST::get_infact_harvest(pk::get_city(buildingid));
				else
					季度粮收入 = base_t.base_harvest;

				int 季度粮支出 = pk::get_troops(building) * 25 / 1000 * 9;

				int 季度粮盈余 = 季度粮收入 - 季度粮支出;

				int 预计下季度粮草 = pk::get_food(building) - turn_to_next_quarter() * 季度粮支出 / 8 + 季度粮收入;

				bool 战争状态 = pk::enemies_around(building);

				int troops_dif_final = pk::get_troops(building) / 3 + int(pk::rand(5000));

				// 至少要留下5000人
				troops_dif_final = pk::min(troops_dif_final, pk::get_troops(building) - 5000);

				// 解散的人数少于3000人则无必要,负数也可以这里过滤掉
				if (troops_dif_final < 3000)
					return;

				// 当游戏陷入死局,出征粮草严重不足,且季度粮收入养不活现有士兵时,解散部分士兵.
				// 解散的同时增加人口.兵粮和金钱
				// 一共有3种情况:
				bool 情况1 = (pk::get_food(building) - turn_to_next_quarter() * 季度粮支出 / 8 < 0 and pk::get_gold(building) < 1000 and turn_to_next_quarter() < 5);				  // 撑不到下个季度,也没钱买粮
				bool 情况2 = (预计下季度粮草 < (大城市 ? 20000 : 10000) and 季度粮盈余 < 0 and pk::get_gold(building) < (大城市 ? 5000 : 3000));									  // 粮草很少了,下季度会更缺,也没钱买粮
				bool 情况3 = (预计下季度粮草 < (大城市 ? 30000 : 10000) and 季度粮盈余 < 0 and pk::get_troops(building) > 60000 and pk::get_gold(building) < (大城市 ? 5000 : 3000)); // 兵太多了,养不活,存量也不多了,也买不起粮

				string building_name = pk::decode(pk::get_name(building));
				// pk::trace(pk::format("building_nam:{},情况1:{},情况2:{},情况3:{}", building_name,情况1,情况2,情况3));

				if ((情况1 or 情况2 or 情况3) and !战争状态 and pk::get_food(building) < 20000)
				{
					ch::add_troops(building, -troops_dif_final, true);
					ch::add_population(building.get_id(), int(troops_dif_final * 1.0));
					ch::add_mil_pop_all(building.get_id(), int(troops_dif_final * 0.3));
					pk::add_gold(building, int(troops_dif_final * 0.2), true);
					pk::add_food(building, int(troops_dif_final * 0.8), true);
					// pk::trace(pk::format("building_nam:{},情况1:{},情况2:{},情况3:{}", building_name, 情况1, 情况2, 情况3));
					pk::history_log(building.pos, pk::get_force(building.get_force_id()).color, pk::encode(pk::format("\x1b[1x{} 军中粮草难以为继,\x1b[1x{}士兵被解散归乡。", pk::decode(pk::get_name(building)), int(troops_dif_final), 0)));
				}
			}
		}
		int turn_to_next_quarter()
		{

			int n = (2 - (pk::get_month() - 1) % 3) * 3 + (pk::get_day() == 21 ? 0 : (pk::get_day() == 11 ? 1 : 2));
			return n + 1;
		}

	} // class

	Main main;
}